#ifndef _Switch_thread_H_
#define _Switch_thread_H_
#include "stdint.h"

#include "main.h"




typedef enum 
{
	SW_OUT1 = 1,
	SW_OUT2,
	SW_OUT3,
	SW_OUT4,
}Switch_OUT_Index_e;

typedef enum 
{
	SW_IN1 = 1,
	SW_IN2,
	SW_IN3,
	SW_IN4,
}Switch_IN_Index_e;

typedef enum 
{
	LED_IO1 = 1,
	LED_IO2,
	LED_IO3,
	LED_IO4,
}LED_IO_Index_e;

typedef enum 
{
	LED_FB1 = 1,
	LED_FB2,
	LED_FB3,
	LED_FB4,
}LED_FB_Index_e;

typedef enum 
{
	SW_Control = 0,
	SW_Response = 1,
	SW_Heartbeat = 2
}Switch_Protocol_Type;

typedef enum 
{
	SW_ON = 0,
	SW_OFF = 1,
}Switch_Status_Type;



#define SW1_OUT_ON()	HAL_GPIO_WritePin(SW_OUT1_GPIO_Port,SW_OUT1_Pin,GPIO_PIN_SET)
#define SW2_OUT_ON()	HAL_GPIO_WritePin(SW_OUT2_GPIO_Port,SW_OUT2_Pin,GPIO_PIN_SET)
#define SW3_OUT_ON()	HAL_GPIO_WritePin(SW_OUT3_GPIO_Port,SW_OUT3_Pin,GPIO_PIN_SET)	
#define SW4_OUT_ON()	HAL_GPIO_WritePin(SW_OUT4_GPIO_Port,SW_OUT4_Pin,GPIO_PIN_SET)	

#define SW1_OUT_OFF()	HAL_GPIO_WritePin(SW_OUT1_GPIO_Port,SW_OUT1_Pin,GPIO_PIN_RESET)
#define SW2_OUT_OFF()	HAL_GPIO_WritePin(SW_OUT2_GPIO_Port,SW_OUT2_Pin,GPIO_PIN_RESET)
#define SW3_OUT_OFF()	HAL_GPIO_WritePin(SW_OUT3_GPIO_Port,SW_OUT3_Pin,GPIO_PIN_RESET)	
#define SW4_OUT_OFF()	HAL_GPIO_WritePin(SW_OUT4_GPIO_Port,SW_OUT4_Pin,GPIO_PIN_RESET)

#define	SW1_IN()	HAL_GPIO_ReadPin(SW_IN1_GPIO_Port,SW_IN1_Pin)
#define	SW2_IN()	HAL_GPIO_ReadPin(SW_IN2_GPIO_Port,SW_IN2_Pin)
#define	SW3_IN()	HAL_GPIO_ReadPin(SW_IN3_GPIO_Port,SW_IN3_Pin)
#define	SW4_IN()	HAL_GPIO_ReadPin(SW_IN4_GPIO_Port,SW_IN4_Pin)

#define LED1_IO_ON()	HAL_GPIO_WritePin(LED_IO1_GPIO_Port,LED_IO1_Pin,GPIO_PIN_SET)
#define LED2_IO_ON()	HAL_GPIO_WritePin(LED_IO2_GPIO_Port,LED_IO2_Pin,GPIO_PIN_SET)
#define LED3_IO_ON()	HAL_GPIO_WritePin(LED_IO3_GPIO_Port,LED_IO3_Pin,GPIO_PIN_SET)	
#define LED4_IO_ON()	HAL_GPIO_WritePin(LED_IO4_GPIO_Port,LED_IO4_Pin,GPIO_PIN_SET)

#define LED1_IO_OFF()	HAL_GPIO_WritePin(LED_IO1_GPIO_Port,LED_IO1_Pin,GPIO_PIN_RESET)
#define LED2_IO_OFF()	HAL_GPIO_WritePin(LED_IO2_GPIO_Port,LED_IO2_Pin,GPIO_PIN_RESET)
#define LED3_IO_OFF()	HAL_GPIO_WritePin(LED_IO3_GPIO_Port,LED_IO3_Pin,GPIO_PIN_RESET)	
#define LED4_IO_OFF()	HAL_GPIO_WritePin(LED_IO4_GPIO_Port,LED_IO4_Pin,GPIO_PIN_RESET)

#define LED1_FB_ON()	HAL_GPIO_WritePin(LED_FB1_GPIO_Port,LED_FB1_Pin,GPIO_PIN_SET)
#define LED2_FB_ON()	HAL_GPIO_WritePin(LED_FB2_GPIO_Port,LED_FB2_Pin,GPIO_PIN_SET)
#define LED3_FB_ON()	HAL_GPIO_WritePin(LED_FB3_GPIO_Port,LED_FB3_Pin,GPIO_PIN_SET)	
#define LED4_FB_ON()	HAL_GPIO_WritePin(LED_FB4_GPIO_Port,LED_FB4_Pin,GPIO_PIN_SET)

#define LED1_FB_OFF()	HAL_GPIO_WritePin(LED_FB1_GPIO_Port,LED_FB1_Pin,GPIO_PIN_RESET)
#define LED2_FB_OFF()	HAL_GPIO_WritePin(LED_FB2_GPIO_Port,LED_FB2_Pin,GPIO_PIN_RESET)
#define LED3_FB_OFF()	HAL_GPIO_WritePin(LED_FB3_GPIO_Port,LED_FB3_Pin,GPIO_PIN_RESET)	
#define LED4_FB_OFF()	HAL_GPIO_WritePin(LED_FB4_GPIO_Port,LED_FB4_Pin,GPIO_PIN_RESET)


typedef union{
	struct
	{
		uint8_t relay_out4:1;
		uint8_t sw_in4:1;
		uint8_t relay_out3:1;
		uint8_t sw_in3:1;
		uint8_t relay_out2:1;
		uint8_t sw_in2:2;
		uint8_t relay_out1:1;
		uint8_t sw_in1:1;
	};
}SW_Status;

//输入开关状态
typedef union{
	struct
	{
		uint8_t :4;
		uint8_t IN4:1;
		uint8_t IN3:1;
		uint8_t IN2:1;
		uint8_t IN1:1;
	};
}
Chanle_IN_t;
/****************开关控制协议***************/
typedef struct
{
	uint8_t     type;       //包类型
  SW_Status   status;    //状态
	uint32_t    id;         //网络ID
}Switch_Protocol;

typedef struct
{
	uint16_t time;             //当前时间
	uint16_t filter_time;      //滤波阈值时间
	uint8_t out_status;       //滤波器输出状态
	uint8_t in_last_status;   //上次输入状态
}Switch_Filter_t;

typedef struct
{
	Chanle_IN_t SW_IN_Status;
	Chanle_IN_t SW_IN_FB_Status;
	Chanle_IN_t SW_OUT_Status;
}Switch_Model_t;

//开关重发控制
typedef struct
{
	uint32_t time;
	uint32_t wait_time;        //等待时间
	uint8_t  retry_number;     //重发次数
	uint8_t  response_step;    //响应的步骤
}Switch_Retry_t;

typedef enum
{
	ResPonse_step_success=0,
	Response_step_wait=1,
	ResPonse_step_overtime=2,
}Response_Step;

void Lora_Switch_Recive(uint8_t *data,uint8_t len);
void Switch_thread_entry(void *paremeter);

Chanle_IN_t User_Get_Relay_status();
Chanle_IN_t User_Get_Sw_status();
#endif

